package com.resms.saas.producer.provider;


import com.resms.saas.api.CacheService;
import org.apache.dubbo.config.annotation.Method;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;

/**
 *  缓存数据分为永久缓存和非永久缓存，永久缓存缓存一些配置类的高频读很少变更的数据，非永久缓存缓存一些高频读低频写的数据
 *  缓存数据保鲜策略：
 *  1.设置超时时间，获得缓存时缓存不存在则从数据库加载数据更新缓存后，再返回加载的最新数据，设置缓存时考虑并发问题
 *  2.定时任务定时更新，可考虑日终时统一刷数
 *  3.事件通知更新策略，提供事件通知服务，根据接收到事件来更新相关缓存
 *
 *
 * Created by sam on 2019/5/25.<br >
 */
@Component("cacheService")
@Service(interfaceName = "cacheService",interfaceClass = CacheService.class,
        version = "0.1.0",
        timeout = 2000,
        retries = 2,
        loadbalance = "random",
        actives = 200,
        executes = 200,
        methods = {
        @Method(name="sayHello",timeout=1000,retries=9,loadbalance="leastactive",executes=50,actives=5)
})
public class CacheServiceImpl implements CacheService {

    /**
     * 从数据库加载指定类型的所有账户到缓存
     * @param accountType
     * @return
     */
    public int loadAllAccount(int accountType){
        if(1 == accountType){//行内借记卡

        } else if(2 == accountType){//行内贷记卡

        } else{
            //其他卡种
        }
        return 0;
    }

    /**
     * 从数据库加载指定key值账户到缓存，更新缓存时考虑并发问题，
     * @param key
     * @param accountType
     * @return
     */
    public int loadAccount(String key,int accountType){
        if(1 == accountType){//行内借记卡

        } else if(2 == accountType){//行内贷记卡

        } else{
            //其他卡种
        }
        return 0;
    }
    public String getCache(String key){
        return "";
    }

    /**
     * 设置永久缓存
     * @param key
     * @param value
     * @return
     */
    public String setCache(String key,String value){
        return "";
    }

    /**
     * 设置有超时时间的缓存
     * @param key
     * @param value
     * @param timeout
     * @return
     */
    public String setCache(String key,String value,int timeout){
        return "";
    }

    /**
     * 获取缓存，如果缓存不存在则返回默认值
     * @param key
     * @param defaultValue
     * @return
     */
    public String getCache(String key,String defaultValue){
        return "";
    }

    /**
     *
     * @param key
     * @return
     */
    public String getSetCache(String key){
        return "";
    }
}
